package com.yk.alert_dialog;

import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;

/**
 * @Classname AlertDialog
 * @Description 确认弹窗
 * @Author Kuan.Yang
 * @Since 2021/8/12 8:40
 */
public abstract class AlertDialog extends Dialog {

    public AlertDialog(@NonNull Context context) {
        super(context, R.style.AlertBaseDialogTheme);
        setContentView(R.layout.dialog_alert);
        windowConfig();

        findViewById(R.id.tv_neutral).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (neutral(AlertDialog.this)) {
                    dismiss();
                }
            }
        });
        findViewById(R.id.tv_negative).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (negative(AlertDialog.this)) {
                    dismiss();
                }
            }
        });
        findViewById(R.id.tv_positive).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //确定
                positive(AlertDialog.this);
            }
        });
    }

    private void windowConfig() {
        Window window = getWindow();
        if (window != null) {
            window.setWindowAnimations(R.style.AlertBaseDialogWindowAnim);
            WindowManager.LayoutParams params = window.getAttributes();
            params.width = WindowManager.LayoutParams.MATCH_PARENT;
            params.height = WindowManager.LayoutParams.WRAP_CONTENT;
            window.setAttributes(params);
            window.setGravity(Gravity.CENTER);
        }
        setCanceledOnTouchOutside(true);
    }

    @Override
    public void setCanceledOnTouchOutside(boolean cancel) {
        try {
            if (cancel) {
                findViewById(R.id.fl_container).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dismiss();
                    }
                });
            } else {
                findViewById(R.id.fl_container).setOnClickListener(null);
            }
        } catch (Exception e) {

        }
        super.setCanceledOnTouchOutside(cancel);
    }

    /**
     * 点击弹窗区域外弹窗是否消失
     *
     * @param cancel true设置为点击区域外外弹消失、false设置为点击区域外弹窗不消失
     * @return
     */
    public AlertDialog setCanceledOutside(boolean cancel) {
        setCanceledOnTouchOutside(cancel);
        return AlertDialog.this;
    }

    /**
     * 设置背景样式
     *
     * @param background 背景样式
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    public AlertDialog setBackground(Drawable background) {
        findViewById(R.id.cl_layout).setBackground(background);
        return AlertDialog.this;
    }

    /**
     * 设置背景样式
     *
     * @param resid 资源id
     * @return
     */
    public AlertDialog setBackgroundResource(@DrawableRes int resid) {
        findViewById(R.id.cl_layout).setBackgroundResource(resid);
        return AlertDialog.this;
    }

    /**
     * 设置背景色
     *
     * @param color 色值
     * @return
     */
    public AlertDialog setBackgroundColor(@ColorInt int color) {
        findViewById(R.id.cl_layout).setBackgroundColor(color);
        return AlertDialog.this;
    }

    /**
     * 设置弹窗的基准标高 阴影
     *
     * @param elevation 高度(单位px)
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public AlertDialog setElevation(float elevation) {
        findViewById(R.id.cl_layout).setElevation(elevation);
        return AlertDialog.this;
    }

    /**
     * 设置标题
     *
     * @param text 标题
     * @return
     */
    public AlertDialog setDialogTitle(CharSequence text) {
        ((TextView) findViewById(R.id.tv_title)).setText(text);
        return AlertDialog.this;
    }

    /**
     * 设置标题文字颜色
     *
     * @param color 标题文字颜色
     * @return
     */
    public AlertDialog setDialogTitleColor(@ColorInt int color) {
        ((TextView) findViewById(R.id.tv_title)).setTextColor(color);
        return AlertDialog.this;
    }

    /**
     * 设置标题字号
     *
     * @param size 字号(单位dip)
     * @return
     */
    public AlertDialog setDialogTitleSize(float size) {
        ((TextView) findViewById(R.id.tv_title)).setTextSize(TypedValue.COMPLEX_UNIT_DIP, size);
        return AlertDialog.this;
    }

    /**
     * 设置标题字号
     *
     * @param unit TypedValue.COMPLEX_UNIT_PX-文字单位px、TypedValue.COMPLEX_UNIT_SP-文字单位sp、TypedValue.COMPLEX_UNIT_DIP-文字单位dip
     * @param size 字号
     * @return
     */
    public AlertDialog setDialogTitleSize(int unit, float size) {
        ((TextView) findViewById(R.id.tv_title)).setTextSize(unit, size);
        return AlertDialog.this;
    }

    /**
     * 设置内容
     *
     * @param text 内容
     * @return
     */
    public AlertDialog setDialogContent(CharSequence text) {
        ((TextView) findViewById(R.id.tv_content)).setText(text);
        return AlertDialog.this;
    }

    /**
     * 设置内容文字颜色
     *
     * @param color 内容文字颜色
     * @return
     */
    public AlertDialog setDialogContentColor(@ColorInt int color) {
        ((TextView) findViewById(R.id.tv_content)).setTextColor(color);
        return AlertDialog.this;
    }

    /**
     * 设置内容文字字号
     *
     * @param size 字号(单位dip)
     * @return
     */
    public AlertDialog setDialogContentSize(float size) {
        ((TextView) findViewById(R.id.tv_content)).setTextSize(TypedValue.COMPLEX_UNIT_DIP, size);
        return AlertDialog.this;
    }

    /**
     * 设置内容文字字号
     *
     * @param unit TypedValue.COMPLEX_UNIT_PX-文字单位px、TypedValue.COMPLEX_UNIT_SP-文字单位sp、TypedValue.COMPLEX_UNIT_DIP-文字单位dip
     * @param size 字号
     * @return
     */
    public AlertDialog setDialogContentSize(int unit, float size) {
        ((TextView) findViewById(R.id.tv_content)).setTextSize(unit, size);
        return AlertDialog.this;
    }

    /**
     * 是否显示中立按钮
     *
     * @param visibility
     * @return
     */
    public AlertDialog showNeutral(int visibility) {
        findViewById(R.id.tv_neutral).setVisibility(visibility);
        return AlertDialog.this;
    }

    /**
     * 设置中立按钮文字
     *
     * @param text 按钮文字
     * @return
     */
    public AlertDialog setNeutralText(CharSequence text) {
        TextView textView = (TextView) findViewById(R.id.tv_neutral);
        textView.setText(text);
        return AlertDialog.this;
    }

    /**
     * 设置中立按钮文字颜色
     *
     * @param color 文字颜色
     * @return
     */
    public AlertDialog setNeutralColor(@ColorInt int color) {
        TextView textView = (TextView) findViewById(R.id.tv_neutral);
        textView.setTextColor(color);
        return AlertDialog.this;
    }

    /**
     * 设置中立按钮文字字号
     *
     * @param size 字号(单位dip)
     * @return
     */
    public AlertDialog setNeutralSize(float size) {
        TextView textView = (TextView) findViewById(R.id.tv_neutral);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size);
        return AlertDialog.this;
    }

    /**
     * 设置中立按钮文字字号
     *
     * @param unit TypedValue.COMPLEX_UNIT_PX-文字单位px、TypedValue.COMPLEX_UNIT_SP-文字单位sp、TypedValue.COMPLEX_UNIT_DIP-文字单位dip
     * @param size 字号
     * @return
     */
    public AlertDialog setNeutralSize(int unit, float size) {
        TextView textView = (TextView) findViewById(R.id.tv_neutral);
        textView.setTextSize(unit, size);
        return AlertDialog.this;
    }

    /**
     * 是否显示消极按钮
     *
     * @param visibility
     * @return
     */
    public AlertDialog showNegative(int visibility) {
        findViewById(R.id.tv_negative).setVisibility(visibility);
        return AlertDialog.this;
    }

    /**
     * 设置消极按钮文字
     *
     * @param text 按钮文字
     * @return
     */
    public AlertDialog setNegativeText(CharSequence text) {
        TextView textView = (TextView) findViewById(R.id.tv_negative);
        textView.setText(text);
        return AlertDialog.this;
    }

    /**
     * 设置消极按钮文字颜色
     *
     * @param color 文字颜色
     * @return
     */
    public AlertDialog setNegativeColor(@ColorInt int color) {
        TextView textView = (TextView) findViewById(R.id.tv_negative);
        textView.setTextColor(color);
        return AlertDialog.this;
    }

    /**
     * 设置消极按钮文字字号
     *
     * @param size 字号(单位dip)
     * @return
     */
    public AlertDialog setNegativeSize(float size) {
        TextView textView = (TextView) findViewById(R.id.tv_negative);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size);
        return AlertDialog.this;
    }

    /**
     * 设置消极按钮文字字号
     *
     * @param unit TypedValue.COMPLEX_UNIT_PX-文字单位px、TypedValue.COMPLEX_UNIT_SP-文字单位sp、TypedValue.COMPLEX_UNIT_DIP-文字单位dip
     * @param size 字号
     * @return
     */
    public AlertDialog setNegativeSize(int unit, float size) {
        TextView textView = (TextView) findViewById(R.id.tv_negative);
        textView.setTextSize(unit, size);
        return AlertDialog.this;
    }

    /**
     * 设置积极按钮文字
     *
     * @param text 按钮文字
     * @return
     */
    public AlertDialog setPositiveText(CharSequence text) {
        TextView textView = (TextView) findViewById(R.id.tv_positive);
        textView.setText(text);
        return AlertDialog.this;
    }

    /**
     * 设置积极按钮的文字颜色
     *
     * @param color 文字颜色
     * @return
     */
    public AlertDialog setPositiveColor(@ColorInt int color) {
        TextView textView = (TextView) findViewById(R.id.tv_positive);
        textView.setTextColor(color);
        return AlertDialog.this;
    }

    /**
     * 设置积极按钮的字号
     *
     * @param size 字号(单位dip)
     * @return
     */
    public AlertDialog setPositiveSize(float size) {
        TextView textView = (TextView) findViewById(R.id.tv_positive);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size);
        return AlertDialog.this;
    }

    /**
     * 设置积极按钮的字号
     *
     * @param unit TypedValue.COMPLEX_UNIT_PX-文字单位px、TypedValue.COMPLEX_UNIT_SP-文字单位sp、TypedValue.COMPLEX_UNIT_DIP-文字单位dip
     * @param size 字号
     * @return
     */
    public AlertDialog setPositiveSize(int unit, float size) {
        TextView textView = (TextView) findViewById(R.id.tv_positive);
        textView.setTextSize(unit, size);
        return AlertDialog.this;
    }

    /**
     * 积极按钮回调事件
     *
     * @param dialog
     */
    public void positive(AlertDialog dialog) {
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }
    }

    /**
     * 消极按钮回调事件
     *
     * @param dialog
     * @return true事件调用后默认关闭弹窗，false事件调用后默认不关闭弹窗
     */
    public boolean negative(AlertDialog dialog) {
        return true;
    }

    /**
     * 中立按钮回调事件
     *
     * @param dialog
     * @return true事件调用后默认关闭弹窗，false事件调用后默认不关闭弹窗
     */
    public boolean neutral(AlertDialog dialog) {
        return true;
    }

}
